home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 10
/
AACD 10.iso
/
AACD
/
Online
/
SpeakFreely
/
src
/
lpc10
/
vparms.c
< prev
Wrap
C/C++ Source or Header
|
2000-05-18
|
4KB
|
138 lines
/**********************************************************************
*
* VPARMS Version 50
*
**********************************************************************
*
* Calculate voicing parameters:
*
* Inputs:
* VWIN - Voicing window limits
* INBUF - Input speech buffer
* LPBUF - Low pass filtered speech
* BUFLIM - Array bounds for INBUF and LPBUF
* HALF - Half frame (1 or 2)
* DITHER - Zero crossing threshold
* MINTAU - Lag corresponding to minimum AMDF value (pitch estimate)
* Outputs:
* ZC - Zero crossing rate
* LBE - Low band energy (sum of magnitudes - SM)
* FBE - Full band energy (SM)
* QS - Ratio of 6 dB/oct preemphasized energy to full band energy
* RC1 - First reflection coefficient
* AR_B - Product of the causal forward and reverse pitch
* prediction gains
* AR_F - Product of the noncausal forward and reverse pitch
* prediction gains
* Internal:
* OLDSGN - Previous sign of dithered signal
* VLEN - Length of voicing window
* START - Lower address of current half of voicing window
* STOP - Upper address of current half of voicing window
* E_0 - Energy of LPF speech (sum of squares - SS)
* E_B - Energy of LPF speech backward one pitch period (SS)
* E_F - Energy of LPF speech forward one pitch period (SS)
* R_B - Autocovariance of LPF speech backward one pitch period
* R_F - Autocovariance of LPF speech forward one pitch period
* LP_RMS - Energy of LPF speech (sum of magnitudes - SM)
* AP_RMS - Energy of all-pass speech (SM)
* E_PRE - Energy of 6dB preemphasized speech (SM)
* E0AP - Energy of all-pass speech (SS)
*/
#include "lpcdefs.h"
#include <math.h>
vparms(vwin, inbuf, lpbuf, half, dither, mintau, zc, lbe, fbe, qs, rc1, ar_b, ar_f )
int *vwin;
float *inbuf;
int half, *zc, *lbe, *fbe, mintau;
float *dither, *qs, *rc1, *ar_b;
float *ar_f;
float *lpbuf;
{
int i, vlen, start, stop;
float oldsgn, e_0, e_b, r_b, lp_rms, ap_rms, e_pre, e0ap;
float e_f, r_f;
float sign;
float *ptr1, *ptr2;
/******** VWIN(1) => vwin[0][2] ********
******** VWIN(2) => vwin[1][2] ********/
/* Calculate zero crossings (ZC) and several energy and correlation
* measures on low band and full band speech. Each measure is taken
* over either the first or the second half of the voicing window,
* depending on the variable HALF. */
lp_rms = 0.;
ap_rms = 0.;
e_pre = 0.;
e0ap = 0.;
*rc1 = 0.;
e_0 = 0.;
e_b = 0.;
e_f = 0.;
r_f = 0.;
r_b = 0.;
*zc = 0;
vlen = *(vwin+AF+2) - *(vwin+2) + 1;
start = *(vwin+2) + (half-1)*(vlen>>1) + 1;
stop = start + (vlen>>1) - 1;
oldsgn = (*(inbuf+start-1)-*dither < 0)?-1.:1.;
ptr1 = lpbuf+start;
ptr2 = inbuf+start;
for(i=start; i<= stop; i++) {
lp_rms += (float)fabs((double)(*ptr1));
ap_rms += (float)fabs((double)*ptr2);
e_pre += (float)fabs((double)(*ptr2-*(ptr2-1)));
e0ap += *ptr2**ptr2;
*rc1 += *ptr2**(ptr2-1);
e_0 += *ptr1**ptr1;
e_b += *(ptr1-mintau)**(ptr1-mintau);
e_f += *(ptr1+mintau)**(ptr1+mintau);
r_f += *ptr1**(ptr1+mintau);
r_b += *ptr1**(ptr1-mintau);
sign = (*ptr2+ *dither < 0)?-1.:1.;
if( sign != oldsgn ) {
*zc += 1;
oldsgn = -oldsgn;
}
*dither = -*dither;
ptr1++; ptr2++;
}
/* Normalized short-term autocovariance coefficient at unit sample delay */
*rc1 /= mmax(e0ap,1.);
/* Ratio of the energy of the first difference signal (6 dB/oct preemphasis)
* to the energy of the full band signal */
*qs = e_pre / mmax(2.*ap_rms,1.);
/* aR_b is the product of the forward and reverse prediction gains,
* looking backward in time (the causal case). */
/***** *ar_b = (r_b / mmax(e_b,1.)) * (r_b / mmax(e_0,1.)); *****/
*ar_b = (r_b * r_b) / (mmax(e_b,1.) * mmax(e_0,1.));
/* aR_f is the same as aR_b, but looking forward in time (non causal case). */
*ar_f = (r_f / mmax(e_f,1.)) * (r_f / mmax(e_0,1.));
/* Normalize ZC, LBE, and FBE to old fixed window length of 180.
* (The fraction 90/VLEN has a range of .58 to 1) */
/*****
*zc = L_nint( *zc*2 * (90./vlen) );
*lbe = mmin( L_nint( lp_rms*0.25 * (90./vlen) ), 32767 );
*fbe = mmin( L_nint( ap_rms*0.25 * (90./vlen) ), 32767 );
*****/
*zc = ( *zc*2 * (90./vlen) ) + .5;
*lbe = mmin( ( lp_rms*0.25 * (90./vlen) )+.5, 32767 );
*fbe = mmin( ( ap_rms*0.25 * (90./vlen) )+.5, 32767 );
}